package com.wu.llpsw.entity.villager;

import com.google.common.collect.ImmutableSet;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.world.entity.ai.village.poi.PoiType;
import net.minecraft.world.entity.npc.VillagerProfession;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;

import java.lang.reflect.InvocationTargetException;

import static net.minecraftforge.registries.ForgeRegistries.PROFESSIONS;

public class ModVillagers {
    // 注册一个POI类型，POI用于定义一些特殊的方块。可以被村民感知和利用，例如床，工作台等。
    public static final DeferredRegister<PoiType> POT_TYPES =
            DeferredRegister.create(ForgeRegistries.POI_TYPES, "wu");
    // 注册事件，用于注册村民的职业
    public static final DeferredRegister<VillagerProfession> VILLAGER_PROFESSION =
            DeferredRegister.create(PROFESSIONS,"wu");

    // 注册一个POI类型，名字是cratfingtable_poi
    // 用于村民感知该方块
    // 其中ImmutableSet用于创建一个不可变的集合。其中getStateDefinition获得方块的属性和值。getPossibleStates返回所有的状态的可能性。
    // 最大数目指的是最多可以被多少村民使用，最远距离是村民可以隔离该方块多远可以工作。
    public static final RegistryObject<PoiType> cratfingtable_poi = POT_TYPES.register("cratfingtable_poi",
            ()->new PoiType("xiushi_poi",ImmutableSet.copyOf(Blocks.CRAFTING_TABLE.getStateDefinition().getPossibleStates()),
                    1,1));
    // 注册一个村民的职业
    // 名称是jumpy_master，
    // poi表示了工作的方块
    // 最后一个表示工作的发出的声音
    public static final RegistryObject<VillagerProfession> XIUSHI = VILLAGER_PROFESSION.register("xiushi",
            () -> new VillagerProfession("xiushi", (PoiType)cratfingtable_poi.get(), ImmutableSet.of(), ImmutableSet.of(),
                    SoundEvents.VILLAGER_WORK_ARMORER));

    public static void registerPOIs(){
        try{
            // 获得PoiType类的一个registerBlockStates方法,通过invoke调用将JUMPY_BLOCK_POI添加到poiType类中。
            ObfuscationReflectionHelper.findMethod(PoiType.class,
                    "registerBlockStates",PoiType.class).invoke(null,cratfingtable_poi.get());
        }catch (InvocationTargetException | IllegalAccessException exception){
            exception.printStackTrace();
        }
    }


    public static void register(IEventBus eventBus){
        POT_TYPES.register(eventBus);
        VILLAGER_PROFESSION.register(eventBus);
    }
}
